package com.niit.maxandmin;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * Date:2024/10/25
 * Author：Ys
 * Description:
 *              第三个参数：MaxAndMinValue 这个输出是我们自己封装的，这个类已经含有我们要最终输出的信息
 *              第四个参数： 因为我们在第三个餐宿已经含有我们想要的结果了，所以第四个参数是没有实际意义，那么就用NullWritable
 */
public class MaxAndMinMapper  extends Mapper<LongWritable, Text,MaxAndMinValue, NullWritable> {

    private long min;
    private long max;
    private int total;

    //初始化操作
    @Override
    protected void setup(Mapper<LongWritable, Text, MaxAndMinValue, NullWritable>.Context context) throws IOException, InterruptedException {
        min = Long.MIN_VALUE; // 例如： -99
        max = Long.MAX_VALUE; // 99
        total = 0;
    }

    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, MaxAndMinValue, NullWritable>.Context context) throws IOException, InterruptedException {
        long currentValue = 0; //读取到该行的值 （可能是数字 也可能是单词或字母）
        try{ //用于 监控 try中代码块是否会出现异常

            currentValue = Long.parseLong(value.toString());//将读取的改行数组进行字符串向数字类型转换
            //如果转换失败（单词 字母），就执行catch

        }catch (NumberFormatException e){//当try 中代码块出现异常时，执行catch中的代码块
             return; //返回 内容的意义；结束该方法--》 杀死该方法
        }

        if(currentValue > min){ //99 > -99  2 > 99
            min = currentValue; // 99
        }

        if(currentValue < max){ // -1 < 99  33 < -1
            max = currentValue; // -1
        }

        total++;// 统计完整执行map的次数


    }

    @Override
    protected void cleanup(Mapper<LongWritable, Text, MaxAndMinValue, NullWritable>.Context context) throws IOException, InterruptedException {
                                                        // 99   -1    3
        MaxAndMinValue maxAndMinValue = new MaxAndMinValue(min,max,total);
         context.write(maxAndMinValue,NullWritable.get());
    }
}
